/* lolev.h - interface entre enlace e o canal ponto-a-ponto virtual
 * 
 * A comunicação real entre as máquinas se dará através do uso de sockets
 * UDP criados para esse fim. Entretanto, para a camada de enlace a
 * impressão será a de que existe um canal ponto-a-ponto virtual com outra
 * máquina. Para esse fim, ao invés de usar funções de sockets, na maior
 * parte dos casos será suficiente utilizar as funções aqui definidas. 
 * Algumas essas funções são de uso obrigatório, encapsulando funções já
 * disponíveis na biblioteca.
 *
 * O código oferecido para essas funcoes não pode ser alterado em hipótese
 * alguma, exceto se recomendado pelo professor.
 */

#ifndef _LOLEV_H_ /* prevenção contra múltiplas inclusões */
#define _LOLEV_H_

/*
 * int lolev_init( void ); 
 *     Inicializa a biblioteca de baixo nível que será usada para criar
 *     a abstração de um canal ponto-a-ponto entre duas máquinas.
 *     O valor de retorno é o socket que será usado na comunicação.
 *     Este socket só deve ser necessário caso a implementação opte
 *     por utilizar a função select em algum momento.
 * int lolev_stats( void ); 
 *     Deve ser chamada pela função dll_stats.
 *     Exibirá dados sobre a utilização do canal ponto-a-ponto.
 * int lolev_mtu( int socket ); 
 *     Retorna o tamanho máximo das mensagens aceitas pelo canal. 
 *     Note-se que o MTU (Maximum Transfer Unit) da camada de enlace
 *     será menor que esse valor em função dos cabeçalhos utilizados
 *     pela camada.
 * int lolev_send( void* mensagem, int tamanho ); 
 *     Envia a mensagem no buffer identificado pelo apontador, contendo
 *     o número de bytes indicados por tamanho, através do meio. 
 *     Como a abstração oferecida é de um canal ponto-a-ponto,
 *     note que nunca é necessário se indicar o destino da mensagem
 *     enviada, pois ele será sempre pré-definido.
 * int lolev_recv( void* mensagem, int tammax ); 
 *     Função semelhante à anterior, nesse caso para receber mensagens. 
 *     A semântica dada a tammax e ao valor de retorno não as mesmas da
 *     função recv da interface de sockets.
 * void lolev_shutdown( void ); 
 *     Finaliza a utilização da biblioteca.
 * 
 * Para todas as funções, um valor de retorno negativo indica um erro e a
 * variável global errno oferece uma descrição do erro, que pode ser
 * transformado em uma mensagem na tela pela função perror (da stdio).
 */

int  lolev_init( void ); 
void lolev_stats( void ); 
int  lolev_mtu( void ); 
int  lolev_send( void* mensagem, int tamanho ); 
int  lolev_recv( void* mensagem, int tammax ); 
void lolev_shutdown( void ); 

#endif /* _LOLEV_H_ */
